package cn.huaqingcheng.tool.crypto.digest;

import cn.huaqingcheng.tool.crypto.codec.Base64Tool;
import cn.huaqingcheng.tool.crypto.codec.HexTool;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;

/**
 * <h2>SHA</h2>
 * 安全散列算法（英语：Secure Hash Algorithm，缩写为SHA）是一个密码散列函数家族，是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的，长度固定的字符串（又称消息摘要）的算法。且若输入的消息不同，它们对应到不同字符串的几率很高。
 * <p>
 * SHA家族的算法，由美国国家安全局（NSA）所设计，并由美国国家标准与技术研究院（NIST）发布，是美国的政府标准，其分别是：
 * <li> SHA-0：1993年发布，当时称做安全散列标准（Secure Hash Standard），发布之后很快就被NSA撤回，是SHA-1的前身。</li>
 * <li> SHA-1：1995年发布，SHA-1在许多安全协议中广为使用，包括TLS、GnuPG、SSH、S/MIME和IP sec，是MD5的后继者。
 * 但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1</li>
 * <li> SHA-2：2001年发布，包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
 * SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击，但它的算法跟SHA-1基本上仍然相似。</li>
 * <li> SHA-3：2015年正式发布，由于对MD5出现成功的破解，以及对SHA-0和SHA-1出现理论上破解的方法，NIST感觉需要一个与之前算法不同的，
 * 可替换的加密散列算法，也就是现在的SHA-3。</li>
 *
 * @see <a href="https://zh.wikipedia.org/zh/SHA%E5%AE%B6%E6%97%8F">SHA家族 - 维基百科</a>
 * @see DigestAlgorithm
 */
@SuppressWarnings("unused")
public interface SHATool {

    /**
     * 计算一个字节流, 使用 1M 缓冲区
     *
     * @param is 输入流, 执行完会关闭输入流
     */
    static byte[] digest(InputStream is) {
        return DigestTool.digest(DigestAlgorithm.SHA_256, is);
    }

    /**
     * 计算一个字节流
     *
     * @param is  输入流, 执行完会关闭输入流
     * @param len 每次读取的字节数组大小 (缓冲区)
     */
    static byte[] digest(InputStream is, int len) {
        return DigestTool.digest(DigestAlgorithm.SHA_256, is, len);
    }

    /**
     * 计算摘要, 并转为 16进制字符串
     */
    static String digestHex(String input) {
        return HexTool.formatHex(digest(input.getBytes(StandardCharsets.UTF_8)));
    }

    /**
     * 计算摘要
     */
    static byte[] digest(byte[] input) {
        return DigestTool.digest(DigestAlgorithm.SHA_256, input);
    }

    /**
     * 计算摘要, 并转为 base64编码字符串
     */
    static String digestBase64(String input) {
        return Base64Tool.encodeToStr(digest(input.getBytes(StandardCharsets.UTF_8)));
    }

}
